<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // Object.keys 获取对象所有可枚举属性，不包括Symbol属性，不包括原型链上的属性
    // Object.getOwnPropertyNames 获取对象所有属性，不包括Symbol属性，不包括原型链上的属性
    // Reflect.ownKeys 获取对象所有属性，不包括原型链上的属性
    // for in 获取对象所有可枚举属性，不包括Symbol属性

    function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.prototype.say = true;
    const person = new Person('zhang', 19);
    Object.defineProperty(person, 'sex', {
        configurable: true,
        enumerable: false,
        writable: true,
        value: 'man'
    });
    person[Symbol('level')] = 1;
    console.log(Object.keys(person));
    console.log(Object.getOwnPropertyNames(person));
    console.log(Reflect.ownKeys(person));

    for (const key in person) {
        console.log('for in', key);
    }
</script>
</body>
</html>